// 实现数据拦截
function defineReactive(obj, key, val) {

    // 递归解决深层级对象问题
    observe(val);

    Object.defineProperty(obj, key, {
        get() {
            console.log("get", key)
            return val;
        },
        set(v) {
            if (val !== v) {
                console.log("set", key)
                // 当新值是对象的时候，我们依然要对其做响应式处理
                observe(v);
                val = v;
            }
        }
    })
}

function observe(obj) {
    if (typeof obj === "object" && obj !== null) {
        Object.keys(obj).forEach(key => defineReactive(obj, key, obj[key]))
    }
}

/**
 * 动态新增响应式对象
 * @param obj
 * @param key
 * @param val
 */
function set(obj, key , val){
    defineReactive(obj, key, val);
}

let testObj = {
    a: "test",
    b: "btest",
    c: {
        test: "深c"
    }
}
observe(testObj);


testObj.a
testObj.b = "testasd"
testObj.c.test

testObj.c = {
    i: "新数据设置"
}

set(testObj, "d", "dong")
testObj.d
